package br.com.controleFrota;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteStatement;
import android.util.Log;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class BaseDados {

   private static final String DATABASE_NAME = "frota.db";
   private static final int DATABASE_VERSION = 1;
   
   private static final String TABLE_NAME_LOG = "log_eventos";
   private static final String TABLE_NAME_VIAGEM = "viagem";
   private static final String TABLE_NAME_PARADA = "parada";
   private static final String TABLE_NAME_COMUNICADO = "comunicado";
   
   private static final String VIAGEM_CIDADE = "cidade";
   private static final String VIAGEM_EMPRESA = "empresa";
   private static final String VIAGEM_PRODUTO = "produto";
   

   private Context context;
   private SQLiteDatabase db;

   private SQLiteStatement insertStmtLog;
   private SQLiteStatement insertStmtViagem;
   private SQLiteStatement insertStmtParada;
   private SQLiteStatement insertStmtComunicado;
   
   private static final String INSERT_LOG = "insert into "+ TABLE_NAME_LOG       + "(id_viagem, data,hora,evento,latitude,longitude,velocidade,precisao,provider) values (?,?,?,?,?,?,?,?,?)";
   private static final String INSERT_VIAGEM = "insert into "+ TABLE_NAME_VIAGEM + "(data, cod_viagem, tipo_viagem, cidade, empresa, produto, inicio, status_carregamento, status_descarregamento, fim, sinc) values (?,?,?,?,?,?,?,?,?,?,?)";
   private static final String INSERT_PARADA = "insert into "+ TABLE_NAME_PARADA + "(id_viagem, data_inicio, tempo, aviso, finalizada, latitude, longitude) values (?,?,?,?,?,?,?)";
   private static final String INSERT_COMUNICADO = "insert into "+ TABLE_NAME_COMUNICADO + "(comunicado, tipo_aviso) values (?,?)";

   public BaseDados(Context context) {
      this.context = context;
      OpenHelper openHelper = new OpenHelper(this.context);
      this.db = openHelper.getWritableDatabase();
      
      this.insertStmtLog = this.db.compileStatement(INSERT_LOG);
      this.insertStmtViagem = this.db.compileStatement(INSERT_VIAGEM);
      this.insertStmtParada = this.db.compileStatement(INSERT_PARADA);
      this.insertStmtComunicado = this.db.compileStatement(INSERT_COMUNICADO);
   }

   public long insertLog(Integer id_viagem, String data, String hora, String evento, String latitude, String longitude, String velocidade, String precisao, String provider) {
      
	  this.insertStmtLog.bindLong(1, id_viagem);
	  this.insertStmtLog.bindString(2, data);
	  this.insertStmtLog.bindString(3, hora);
      this.insertStmtLog.bindString(4, evento);
	  this.insertStmtLog.bindString(5, latitude);
	  this.insertStmtLog.bindString(6, longitude);
	  this.insertStmtLog.bindString(7, velocidade);
	  this.insertStmtLog.bindString(8, precisao);
	  this.insertStmtLog.bindString(9, provider);
    							
      return this.insertStmtLog.executeInsert();
   }
   

   public long insertViagem(String data, String cod_viagem, String tipo_viagem, String cidade, String empresa, String produto, String inicio, String status_carregamento, String status_descarregamento, String fim, String sinc) {
      
	  this.insertStmtViagem.bindString(1, data);
	  this.insertStmtViagem.bindString(2, cod_viagem);
      this.insertStmtViagem.bindString(3, tipo_viagem);
	  this.insertStmtViagem.bindString(4, cidade);
	  this.insertStmtViagem.bindString(5, empresa);
	  this.insertStmtViagem.bindString(6, produto);
	  this.insertStmtViagem.bindString(7, inicio);
	  this.insertStmtViagem.bindString(8, status_carregamento);
	  this.insertStmtViagem.bindString(9, status_descarregamento);
	  this.insertStmtViagem.bindString(10, fim);
	  this.insertStmtViagem.bindString(11, sinc);
    							
      return this.insertStmtViagem.executeInsert();
   }
   
   public long insertParada(Integer id_viagem, String data_inicio, String tempo, String aviso, String finalizada, String latitude, String longitude) {
	      
	  this.insertStmtParada.bindLong(1, id_viagem);
	  this.insertStmtParada.bindString(2, data_inicio);
      this.insertStmtParada.bindString(3, tempo);
	  this.insertStmtParada.bindString(4, aviso);
	  this.insertStmtParada.bindString(5, finalizada);
	  this.insertStmtParada.bindString(6, latitude);
	  this.insertStmtParada.bindString(7, longitude);

	  return this.insertStmtParada.executeInsert();
	  
   }
   
   public long insertComunicado(String comunicado, String tipo_aviso) {
	      
	   
	  this.insertStmtComunicado.bindString(1, comunicado);
	  this.insertStmtComunicado.bindString(2, tipo_aviso);
      
	  return this.insertStmtComunicado.executeInsert();
	  
   }

   public void deleteAllLog() {
      this.db.delete(TABLE_NAME_LOG, null, null);
   }
   
   public void deleteViagem(String where) {
	   
	  if(where.equals(""))
		  where = null;
	   
      this.db.delete(TABLE_NAME_VIAGEM, where, null);
   }
   
   public void deleteAllComunicado() {
      this.db.delete(TABLE_NAME_COMUNICADO, null, null);
   }
   
   public void deleteAllParada(String where) {
	   
	   if(where.equals(""))
		   where = null;
	   
      this.db.delete(TABLE_NAME_PARADA, where, null);
   }
   
   
   public Cursor selectViagemId(int id_viagem){
	   
	   Cursor cursor = this.db.query(TABLE_NAME_VIAGEM, new String[] { "_id, data, cod_viagem, tipo_viagem, cidade, empresa, produto, inicio, status_carregamento, status_descarregamento, fim, sinc"},
			   "_id = "+id_viagem, null, null, null, "_id asc");
	   
	   return cursor;
      
   }
   
   public Cursor selectViagemEmAndamento(){
	   
	   Cursor cursor = this.db.query(TABLE_NAME_VIAGEM, new String[] { "_id"},
			   "fim = \"0\" and inicio != \"0\"", null, null, null, "_id asc");
	   
	   return cursor;
      
   }
   
   public Cursor selectViagensDisponiveis(){
	   
	   Cursor cursor = this.db.query(TABLE_NAME_VIAGEM, new String[] { "_id, data, cod_viagem, tipo_viagem, cidade, empresa, produto, inicio, status_carregamento, status_descarregamento, fim"},
			   "inicio = \"0\" and fim = \"0\"", null, null, null, "data asc");
	   
	   return cursor;
      
   }
   
   public Cursor selectAllViagens(String where){
	   
	   if(where.equals(""))
		   where = null;
	   
	   Cursor cursor = this.db.query(TABLE_NAME_VIAGEM, new String[] { "_id, data, cod_viagem, tipo_viagem, cidade, empresa, produto, inicio, status_carregamento, status_descarregamento, fim, sinc"},
			   where, null, null, null, "_id asc");
	   
	   return cursor;
      
   }
   
   public Cursor selectParada(Integer id_viagem){
	   
	   Cursor cursor = this.db.query(TABLE_NAME_PARADA, new String[] { "_id, id_viagem, data_inicio, tempo, aviso, finalizada, latitude, longitude"},
			   "id_viagem = "+id_viagem, null, null, null, "_id desc");
//	   finalizada <> \"t\" AND 
	   return cursor;
      
   }
   
   public Cursor selectParadaId(int id_parada){
	   
	   Cursor cursor = this.db.query(TABLE_NAME_PARADA, new String[] { "_id, id_viagem, data_inicio, tempo, aviso, finalizada, latitude, longitude"},
			   "_id = "+id_parada, null, null, null, "_id asc");
	   
	   return cursor;
      
   }
   
   public Cursor selectComunicado(){
	   
	   Cursor cursor = this.db.query(TABLE_NAME_COMUNICADO, new String[] { "_id, comunicado, tipo_aviso"}, null, null, null, null, "_id desc");
	   
	   return cursor;
      
   }
   
   public Cursor selectLogLocation(int id_viagem){
	   
	   Cursor cursor = this.db.query(TABLE_NAME_LOG, new String[] { "_id","id_viagem","data","hora","evento","latitude","longitude","velocidade","precisao","provider" },
			   "evento = \'CHANGE LOCATION\' and id_viagem = "+id_viagem, null, null, null, "_id asc", "500");
	   
	   return cursor;
      
   }
   
   public Cursor selectAllLog(String where){
	   
	   if(where.equals(""))
		   where = null;
	   
	   Cursor cursor = this.db.query(TABLE_NAME_LOG, new String[] { "_id","id_viagem","data","hora","evento","latitude","longitude","velocidade","precisao","provider"},
			   where, null, null, null, "_id asc");
	   
	   return cursor;
      
   }
   
   public void updateViagem(Integer id_viagem, String inicio, Integer status_carregamento, Integer status_descarregamento, String fim, String sinc)
   {
	   ContentValues values = new ContentValues();
	   
	   if(inicio != null)
		   values.put("inicio", inicio);
	   
	   if(status_carregamento != null)
		   values.put("status_carregamento", String.valueOf(status_carregamento));
	   
	   if(status_descarregamento != null)
		   values.put("status_descarregamento", String.valueOf(status_descarregamento));
	   
	   if(fim != null)
		   values.put("fim", fim);
	   
	   if(sinc != null)
		   values.put("sinc", sinc);
	   
	   this.db.update(TABLE_NAME_VIAGEM, values, "_id =" + id_viagem, null);
	   
	   
   }
   
   public void updateParada(Long id_parada, String finalizada)
   {
	   ContentValues values = new ContentValues();
	   
	   if(finalizada != null)
		   values.put("finalizada", finalizada);

	   this.db.update(TABLE_NAME_PARADA, values, "_id =" + id_parada, null);
	   
	   
   }


   public List<String> selectAllLog() {
      List<String> list = new ArrayList<String>();
      Cursor cursor = this.db.query(TABLE_NAME_LOG, new String[] { "_id","id_viagem","data","hora","evento","latitude","longitude","velocidade","precisao","provider" },
        null, null, null, null, "_id desc");
      if (cursor.moveToFirst()) {
         do {
            list.add(cursor.getString(0)+" - "+cursor.getString(1)+" - "+cursor.getString(2)+" - "+cursor.getString(3)+" - "+cursor.getString(4)+" - "+cursor.getString(5)+" - "+cursor.getString(6)+" - "+cursor.getString(7)+" - "+cursor.getString(8)+" - "+cursor.getString(9));
         } while (cursor.moveToNext());
      }
      if (cursor != null && !cursor.isClosed()) {
         cursor.close();
      }
      return list;
   }

   private static class OpenHelper extends SQLiteOpenHelper {

      OpenHelper(Context context) {
         super(context, DATABASE_NAME, null, DATABASE_VERSION);
      }

      @Override
      public void onCreate(SQLiteDatabase db) {
         db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_NAME_LOG        + "(_id INTEGER PRIMARY KEY AUTOINCREMENT, id_viagem INTEGER, data STRING, hora STRING, evento TEXT, latitude TEXT, longitude TEXT, velocidade TEXT, precisao TEXT, provider TEXT)");
         db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_NAME_VIAGEM     + "(_id INTEGER PRIMARY KEY AUTOINCREMENT, data STRING, cod_viagem STRING, tipo_viagem STRING, cidade TEXT, empresa TEXT, produto TEXT, inicio TEXT, status_carregamento STRING, status_descarregamento STRING, fim TEXT, sinc STRING)");
         db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_NAME_PARADA     + "(_id INTEGER PRIMARY KEY AUTOINCREMENT, id_viagem INTEGER, data_inicio STRING, tempo STRING, aviso STRING, finalizada STRING, latitude TEXT, longitude TEXT)");
         db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_NAME_COMUNICADO + "(_id INTEGER PRIMARY KEY AUTOINCREMENT, comunicado TEXT, tipo_aviso STRING)");
      }

      @Override
      public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
         Log.w("Example", "Upgrading database, this will drop tables and recreate.");
         
//         db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME_LOG);
//         db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME_VIAGEM);
//         db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME_PARADA);
//         db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME_COMUNICADO);
         
         onCreate(db);
      }
   }
}